package br.org.bertol.mestrado.engine.optimisation;

import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;

import br.org.bertol.mestrado.engine.Objective;
import br.org.bertol.mestrado.engine.optimisation.entity.AbstractUnit;
import br.org.bertol.mestrado.engine.optimisation.moo.ParetoDominace;
import br.org.bertol.mestrado.engine.optimisation.moo.ParetoMinMinDominace;

/**
 * Super classe de todos os métodos de busca.
 * @author contaqualquer
 * @param <U>
 */
/**
 * @author contaqualquer
 * @param <U>
 */
public abstract class AbstractMetaHeuristica<T, U extends AbstractUnit<?>>
        extends Thread implements Tecninca {

    /**
     * Objeto Verify. Este objeto possue as matrizes de custo funções de custo.
     */
    protected transient ArrayList<T>         classes;

    /**
     * Objetivos do problema.
     */
    protected transient Objective[]          objectives;
    /**
     * Número de iterções de uma heurística.
     */
    protected final transient long           numIteracoes;

    /**
     * Fronteira de Pareto.
     */
    protected transient ParetoDominace<EnumMap<Objective, Number>> paretoMinMinDominace;

    /**
     * Lista de objetos pareto.
     */
    protected final transient List<U>        listaPareto;

    /**
     * Construtor privado da classe.
     * @param classess
     *            Classes do problema
     * @param objectivess
     *            Objetivos do problema
     * @param numIter
     *            número de iterações
     */
    protected AbstractMetaHeuristica(final long numIter,
        final ArrayList<T> classess, final Objective... objectivess) {
        super();

        this.numIteracoes = numIter;

        classes = classess;

        objectives = objectivess;

        paretoMinMinDominace = new ParetoMinMinDominace();

        listaPareto = new ArrayList<U>();

    }

    /**
     * Construtor privado da classe.
     * @param classess
     *            Classes do problema
     * @param objectivess
     *            Objetivos do problema
     * @param numIter
     *            número de iterações
     * @param swarm
     *            Colônia
     */
    protected AbstractMetaHeuristica(final long numIter,
        final List<U> swarm, final ArrayList<T> classess,
        final Objective... objectivess) {
        super();

        this.numIteracoes = numIter;

        classes = classess;

        objectives = objectivess;

        paretoMinMinDominace = new ParetoMinMinDominace();

        listaPareto = new ArrayList<U>(swarm);

    }
}
